// UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 
// 通过使用显式的字符编码，就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。

// 创建一个bugffer对象
const buf = Buffer.from('runoob','ascii') 

console.log(buf.toString('hex')); //72756e6f6f62
console.log(buf.toString('base64'));//cnVub29i


/*
从缓冲区读取数据
*/
const buff = Buffer.alloc(256); //256位数
// var   len = buff.write("www.runoob.com");

// console.log("写入字节数 : "+  len);
for (var i = 0 ; i < 26 ; i++) {
    buff[i] = i + 97;
}
//ascii 显示现代英语和其他西欧语言，最初用于美国，自产自用
// console.log( buff.toString('ascii'));       // 输出: abcdefghijklmnopqrstuvwxyz
// console.log( buff.toString('ascii',0,5));   //使用 'ascii' 编码, 并输出: abcde
// console.log( buff.toString('utf8',0,5));    // 使用 'utf8' 编码, 并输出: abcde
// console.log( buff.toString(undefined,0,5)); // 使用默认的 'utf8' 编码, 并输出: abcde

//buffer转化为json
const buff1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json  = JSON.stringify(buff1)
console.log(json) // 打印 {"type":"Buffer","data":[1,2,3,4,5]} 类型buffer data:[1,2,3,4,5]
const copy = JSON.parse(json, (key, value) => {
    return value && value.type === 'Buffer' ?
        Buffer.from(value.data) :
        value;
    });
console.log(copy); //<Buffer 01 02 03 04 05>  返回buffer对象

//合并缓存区域
var buffer1 = Buffer.from(('菜鸟教程'));
var buffer2 = Buffer.from(('www.runoob.com'));
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 内容: " + buffer3.toString()); //buffer3 内容: 菜鸟教程www.runoob.com
buffer3 = JSON.stringify(buffer3);
console.log(buffer3) //{"type":"Buffer","data":[232,143,156,233,184,159,230,149,153,231,168,139,119,119,119,46,114,117,110,111,111,98,46,99,111,109]}


//判断俩个buffer谁在前  compare
var buffer1 = Buffer.from('ABC');
var buffer2 = Buffer.from('ABCD');
var result = buffer1.compare(buffer2);
console.log(result)//  result<0   buffer1在前   result==0 俩个buffer相同 result>0 buffer1后

//拷贝buffer
var buffer3 = Buffer.from('abcdefghijkl');
var buffer4 = Buffer.from('RUNOOB');

//将 buffer4 插入到 buffer3 指定位置上
buffer4.copy(buffer3, 2);
console.log(buffer3.toString());

//裁剪buffer slice 
var buffer5 = Buffer.from('runoob');
// 剪切缓冲区
var buffer6 = buffer5.slice(0,2);
console.log("buffer6 content: " + buffer6.toString());


//buffer 长度
console.log("buffer 长度: " + buffer6.length);



//不同类型创建不同buffer
// Buffer.alloc(size[, fill[, encoding]])： 返回一个指定大小的 Buffer 实例，如果没有设置 fill，则默认填满 0
// Buffer.allocUnsafe(size)： 返回一个指定大小的 Buffer 实例，但是它不会被初始化，所以它可能包含敏感的数据
// Buffer.allocUnsafeSlow(size)
// Buffer.from(array)： 返回一个被 array 的值初始化的新的 Buffer 实例（传入的 array 的元素只能是数字，不然就会自动被 0 覆盖）
// Buffer.from(arrayBuffer[, byteOffset[, length]])： 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer。
// Buffer.from(buffer)： 复制传入的 Buffer 实例的数据，并返回一个新的 Buffer 实例
// Buffer.from(string[, encoding])： 返回一个被 string 的值初始化的新的 Buffer 实例
// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);

// 创建一个长度为 10、且用 0x1 填充的 Buffer。 
const buf2 = Buffer.alloc(10, 1);

// 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快，
// 但返回的 Buffer 实例可能包含旧数据，
// 因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);

// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);

// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést');

// 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('tést', 'latin1');